package main

type Float interface {
	~float32 | ~float64
}

type Number interface {
	int64 | Float
}

type MyFloat float32

func main() {
	//// Initialize a map for the integer values
	//ints := map[string]int64{
	//	"first":  34,
	//	"second": 12,
	//}
	//
	//// Initialize a map for the float values
	//floats := map[string]MyFloat{
	//	"first":  35.98,
	//	"second": 26.99,
	//}
	//
	//fmt.Printf("Generic Sums with Constraint: %v and %v\n",
	//	SumNumbers(ints),
	//	SumNumbers(floats))
}

// SumInts adds together the values of m.
func SumInts(m map[string]int64) int64 {
	var s int64
	for _, v := range m {
		s += v
	}
	return s
}

// SumFloats adds together the values of m.
func SumFloats(m map[string]float64) float64 {
	var s float64
	for _, v := range m {
		s += v
	}
	return s
}

// SumIntsOrFloats sums the values of map m. It supports both int64 and float64
// as types for map values.
func SumIntsOrFloats[K comparable, V int64 | float64](m map[K]V) V {
	var s V
	for _, v := range m {
		s += v
	}
	return s
}

// SumNumbers sums the values of map m. Its supports both integers
// and floats as map values.
func SumNumbers[K comparable, V Number](m map[K]V) V {
	var s V
	for _, v := range m {
		s += v
	}
	return s
}
